import {defineConfig, loadEnv} from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from "path";

// vite 官网 https://cn.vitejs.dev/
// vite 配置文档 https://cn.vitejs.dev/config/

/** @type {import('vite').UserConfig} */
export default defineConfig(({ command, mode }) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  // 设置第三个参数为 '' 来加载所有环境变量，而不管是否有 VITE_ 前缀。
  // 如果是两个参数则读取我们配置在 .env.mode的环境变量；加第三个参数 ”“ 则当前主机的全量环境变量配置
  const env = loadEnv(mode, process.cwd())
  console.log("项目根目录： ", process.cwd())
  console.log("读取.env中配置的环境变量", env);
  // 读取运行模式，如果是dev运行 "dev": "vite --mode development", 则mode为development
  console.log("读取mode变量", mode);
  console.log("读取当前环境变量： ", env.VITE_APP_BASE_URL)
  // process.cwd() 可以获取当前工作目录，例如 D:\Git\Git-Repository\vue3-template-web
  console.log("Command: " + command)
  console.log("Mode: " + mode)


  // dev 独有配置
  return {
    // 插件配置，需要用到的插件数组
    plugins: [
      vue(),
      // 自动导入插件，自动引入全局组件、插件、指令等
      AutoImport({
        // 全局导入注册，配置的插件中的函数、对象能够自动引入，不用显示声明
        imports: ['vue', 'vue-router', 'vue-i18n', 'pinia'],
        // 生成相应的.d.ts文件的文件路径。
        // 当“typescript”本地安装时，默认为“./auto-imports.d.ts”。
        dts: 'src/types/auto-import.d.ts',
        // 自定义 resolvers, 需要配合 unplugin-vue-components 插件一起使用
        resolvers: [AntDesignVueResolver()],
      }),
      // 全局组件注册插件，自动扫描并注册全局组件
      Components({
        // 如果使用了本插件，则会自动扫描并注册全局组件，就不需要自己在 main.ts 中手动逐个注册，或者额外写一个插件来扫描并注册全局组件。
        // 用于搜索组件的目录的相对路径。自定义封装的组件目录，dirs 为本项目的组件目录，而 resolver 用于引入第三方组件
        dirs: ['src/components'],
        // 生成`components.d.ts`全局声明，还接受自定义文件名的路径
        dts: 'src/types/components.d.ts',
        // 自定义组件的解析器，为特定的插件提供按需导入的功能
        resolvers: [
            // 按需引入 AntDesignVue 组件，参考 https://antdv.com/docs/vue/introduce-cn
            AntDesignVueResolver({
                // 导入样式以及组件
                importStyle: 'css-in-js',
                resolveIcons: true,
            })
        ],
      }),
      // 用于将 SVG 图标文件转换为可用的组件，并在组件中使用。
      createSvgIconsPlugin({
        // 配置图标文件夹路径（必须）
        iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
        // 配置SymbolId格式
        symbolId: "icon-[dir]-[name]",
      }),
    ],

    // 开发服务器配置，绝对不能配置 https 选项，否则导致整个文件报错
    // 开发服务器选项，配置参考官网 https://cn.vitejs.dev/config/server-options.html
    server: {
      host: '0.0.0.0',
      port: 3000,
      // 为开发服务器配置 CORS,默认启用并允许任何源
      cors: true,
      // 程序启动后是否自动打开浏览器
      open: true,
      // 是否开启热更新
      hmr: true,
      // 配置代理
      proxy: {
        '/api': {
          // 匹配上则转发到target 目标Host
          target: env.VITE_APP_BASE_URL,
          // 是否允许跨域
          changeOrigin: true,
          // 路径重写，将 /api 开头的请求转发到 target
          rewrite: (path) => path.replace(/^\/api/, '')
        },
        '/api/gen': {
          //单体架构下特殊处理代码生成模块代理
          target: env.VITE_IS_MICRO === 'true' ? env.VITE_ADMIN_PROXY_PATH : env.VITE_GEN_PROXY_PATH,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ''),
        },
        // 正则表达式写法：http://localhost:5173/fallback/ -> http://jsonplaceholder.typicode.com/
        '^/fallback/.*': {
          target: 'http://jsonplaceholder.typicode.com',
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/fallback/, ''),
        },
      }
    },

    // 配置 CSS 相关的选项，可以包括内联的 PostCSS 配置、CSS 预处理器配置等
    css: {
      // 配置 CSS 预处理器
      preprocessorOptions: {
        scss: {
          // 引入全局变量文件
          additionalData: `@import "src/styles/variables.scss";`,
        },
      }
    },

    // 配置路径别名
    resolve: {
      alias: {
        '@': '/src',
      },
    },

    // 构建配置
    build: {
      // 构建输出目录
      outDir: 'dist',
      // 静态资源输出目录（相对于 build.outDir）
      assetsDir: 'static',
      // 构建时清空目标目录
      emptyOutDir: true,
      // 构建后是否生成 source map 文件
      sourcemap: false,
      // 构建时的根目录
      base: '/',
      // 构建时的目标环境
      target: 'esnext',
      // 构建时的模式
      mode: 'production',
    },

    // 日志级别
    logLevel: 'info',
    // 设为 false 可以避免 Vite 清屏而错过在终端中打印某些关键信息
    clearScreen: false,
    // 以 envPrefix 内元素开头的环境变量会通过 import.meta.env 暴露在你的客户端源码中。默认只对外暴露以 VITE_ 开头的环境变量。
    envPrefix: ["VITE_", "BUN_", "MODE_"],
  }

})